package udpComunication;

import java.net.*;
import java.io.*;

public class MulticastClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		InetAddress group = null; int port = -1;
		boolean flag=true;
		boolean enable=false;
		boolean start=false;
		FileOutputStream file = null;
		PrintStream output = null;
		//Aggiungo una variabile in modo da controllare il nome del file per ogni gateway
		String nome_nodo_da_controllare = "before_";
		
		try {
			//se il file con questo nome esiste già viene totalmente riscritto
			file = new FileOutputStream(nome_nodo_da_controllare+"node_status.xml");
			output = new PrintStream(file);
			//Stampo l'intestazione dell xml
			output.println("<?xml version = \"1.0\" encoding=\"UTF-8\"?>");
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		try
		{ if (args.length == 2) {
		   group = InetAddress.getByName(args[0]);
		   port = Integer.parseInt(args[1]);
		  } else
		  { System.out.println("Usage: java MulticastClient MCastAddr MCastPort");
		      System.exit(1);
		  }
		 } catch (Exception e){System.exit(2);}

//		 creazione socket multicast e creazione datagram packet
		 MulticastSocket socket = null; DatagramPacket packet = null;
		 byte[] buf = new byte[256];
		 try {
		    socket = new MulticastSocket(port);
		    socket.setSoTimeout(20000); // 20 secondi
		    packet = new DatagramPacket(buf,buf.length);
		    System.out.println("Creata la socket: " + socket);
		 } catch (IOException e){System.exit(3);}

		 try
		 {
		   socket.joinGroup(group); // adesione al gruppo associato
		   System.out.println("Adesione al gruppo " + group.getHostAddress());
		} catch (IOException e){System.exit(4);}
		ByteArrayInputStream biStream = null;
		DataInputStream diStream = null; String linea = null;
		// ciclo di ricezione
		while (flag)
		{
			try
		    {
				packet.setData(buf);
	//			System.out.println("Attendo la ricezione...");
				socket.receive(packet);
	//			System.out.println("RICEVUTO!");
		   } catch (SocketTimeoutException te)
		    { System.out.println("Non ho ricevuto niente per 20 secondi, chiudo!");
		      System.exit(4);
		    } 
		     catch (IOException e) { continue;}
		  try {
		     biStream = new ByteArrayInputStream(packet.getData(),0,packet.getLength());
		     diStream = new DataInputStream(biStream);
		     linea = diStream.readUTF();
		    /**
		     * Controllo che il server multicast stia trasmettendo la prima linea.
		     * Di li in poi posso salvarmi la copia del xml con la garanzia
		     * che sia completo.
		     */
		    if (linea.compareToIgnoreCase("<root>")==0) {
		    	enable = true;
		    }
		    if (enable==true) {
		    	start=true;
		    	System.out.println("Linea ricevuta: " + linea);
		    	//Stampo sul file xml le linee ricevute
		    	output.println(linea);
		    }
		    /**
		     * Controllo che non sia finito l'xml. Se è così concludo la ricezione uscendo dal ciclo.
		     */
		    if (linea.compareToIgnoreCase("</root>")==0) {
		    	enable = false;
		    	if (start==true) flag=false;
		    }
		   } catch (IOException e) { continue;}
		   
		}
		// uscita dal gruppo e chiusura della socket
		System.out.println("\nUscita dal gruppo");
		try { socket.leaveGroup(group); }
		catch (IOException e) { System.out.println("Errore uscendo dal gruppo\n"); }
		System.out.println("MulticastClient: termino...");
		socket.close();
		}


	}

